伪链表实现
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 0 |
伪链表本质是数组,用其下标表示每个人的序号,每个数组元素中存的是下一个人的下标(序号)
代码如下:
//默认从1开始数
#include <stdio.h>
#define N 12
#define M 4
void fun(int *person);
void fun(int *person) {
int pre = N-1; //前驱下标
int cur = 0; //当前下标
int count = 0;
int rest = N;
while(rest) {
if(++count >= M) { //杀人 不能是count++ % M !!!
person[pre] = person[cur]; //当前人出圈
--rest; //剩余存活人数-1
printf("%d\n", cur+1); //输出出圈人序号
count = 0; //数数归零
}
else { //移动到下一个活人
pre = cur;
}
cur = person[cur];
}
}
int main(void) {
int person[N] = {0};
int i;
for(i = 0; i < N; i++) {
person[i] = (i+1) % N;
}
fun(person);
return 0;
}